﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
//using Ext.Net;
using Ext.Net;
using System.Web.Caching;
using System.Xml;
using ENT.GP.Core;
using ENT.GP.Core.Core;
using System.Configuration;
using entgp.Code;
using TreeNode = Ext.Net.TreeNode;
using TreeNodeCollection = Ext.Net.TreeNodeCollection;

namespace entgp
{
    public partial class Principal : PaginasUsuario
    {
       
        protected void Page_Load(object sender, EventArgs e)
        {
            try
            {
                if (Session.Count > 0)
                {

                    lblUser.Text = "Bienvenido " + Session["Usuario"].ToString();
                    lblNombre.Text = " " + Session["NombreUsuario"].ToString();
                    lblRol.Text = " " + Session["Rol"].ToString();

                    //lblUsuario.Text = Session["usuario"].ToString();
                    if (!X.IsAjaxRequest)
                    {

                        //this.Session["Coolite.Theme"] = Ext.Net.Theme.Default;


                        string cargarTab = string.Empty;

                        if (!this.IsPostBack)
                        {
                            Ext.Net.Notification.Show(new  NotificationConfig
                            {
                                Title = "Autenticacion",
                                Icon = Icon.Information,
                                ShowPin = true,
                                //                    Tools = new ToolsCollection { new Tool { Type = ToolType.Help, Handler = Ext.MessageBox.Alert("Ayuda", "Obtiene ayuda del sistema").Serialize() } },
                                Html = string.Format("Bienvenido {0} al sistema ENT-PM", lblNombre.Text)
                            });
                          
                            //
                            var empActivar = Empresas.Get(this.IdEmp);
                            string rutaImg = new UtilRA().RutaArchivosEmpresaGlobal + string.Format("{0}/{1}", empActivar.Codigo,empActivar.UrlLogo);
                            ImageLogo.ImageUrl = rutaImg;
                            
                            //GenerarFrontal();
                            //this.ConstruirArbol(arbolNavegacion.Root, null, true);
                            this.ConstruirArboles(null);

                          
                        }

                        
                    }
                }
                else
                {
                    Response.Redirect("Default.aspx");
                }
            }
            catch (Exception ex)
            {
                Util.RegistarLog(ex.ToString());
            }
        }

        //Inicializando variables
        public string idnodo = string.Empty;
        public string nombrenodo = string.Empty;
        public string urlnodo = string.Empty;
        public string padrenodo = string.Empty;
        public AccordionLayout accNavegacion = new AccordionLayout();

        //Funcion para Crear los TreePanel que se mostraran en el acordeon, leyendo los elementos desde un xml
        private TreePanel ConstruirArboles(TreePanel arbolacord)
        {
            try
            {
                accNavegacion.ID = "accNavegacion";
                accNavegacion.Animate = false;
              
                //Lectura del xml
                XmlDocument xmlArbol = new XmlDocument();
                var ruta =new UtilRA().RutaArchivosEmpresa + string.Format("arbol{0}.xml", Session["CRol"].ToString());
           
                xmlArbol.Load(HttpContext.Current.Server.MapPath(ruta));
                XmlNodeList nodoslista = xmlArbol.GetElementsByTagName("nodo");
                XmlNodeList modulos = nodoslista[0].ChildNodes;
                int id = 0;
                //Recorrido de los modulos principales y creación de los TreePanel
                foreach (XmlElement modulo in modulos)
                {
                    TreePanel subArbol = new TreePanel();
                    subArbol.ID = modulo.GetAttribute("idnodo");
                    subArbol.RootVisible = false;
                    subArbol.AutoScroll = true;
                    subArbol.ContainerScroll = true;
                    subArbol.Lines = false;
                    subArbol.Title = modulo.GetAttribute("nombre");
                    //Llamada al metodo de construccion de los nodos del arbol
                    this.ConstruirArbol(subArbol.Root, modulo.GetAttribute("idnodo"), false);
                    //Implementación de un listener para los nodos del arbol
                    subArbol.Listeners.Click.Handler = "if(node.attributes.href){e.stopEvent();cargarTab(node.attributes.hrefTarget, node.attributes.href, node.id, node.text);}";
                    //subArbol.Listeners.BeforeClick.Handler = "alert('Working0!');";
                    /*subArbol.AddListener("mouseover",new JFunction("alert('Working1!');"));
                    subArbol.AddListener("focus", new JFunction("alert('Working2!');"));
                    subArbol.On("mouseout",new JFunction("alert('Working3!');"));*/
                    //Agregación de el TreePanel al acordeon

                   
                    accNavegacion.Items.Add(subArbol);
                    id++;
                }
              
                pnlOeste.Add(accNavegacion);
            }
            catch (Exception ex)
            {
                Util.RegistarLog(ex.ToString());
            }
            return arbolacord;
        }

        //Función para construir los nodos de los arboles de navegación
        //Parametros de entrada: nodes = nodo de root de arbol a costruir, idnodobase = codigo del nodo que sera el padre principal
        private TreeNodeCollection ConstruirArbol(TreeNodeCollection nodes, string idnodobase, bool llamada)
        {
            try
            {
                //Si Nodos es nulo se crea una coleccion de nodos para guardar los nodos a generarse
                if (nodes == null)
                {
                    nodes = new TreeNodeCollection();
                }
                //Creacion del nodo principal del arbol
                var root = new TreeNode();
                root.Text = "root";
                nodes.Add(root);
                
                //Lectura del xml
                var xDoc = new XmlDocument();
                var ruta = new UtilRA().RutaArchivosEmpresa + string.Format("arbol{0}.xml", Session["CRol"].ToString());
                    
                //xDoc.Load(HttpContext.Current.Server.MapPath("/entgp/resources/arbol" + Session["CRol"].ToString() + ".xml"));
                xDoc.Load(HttpContext.Current.Server.MapPath(ruta));
                XmlNodeList nodosarbol = xDoc.GetElementsByTagName("nodo");
                //Obtención de los hijos del nodo
                XmlNodeList listamodulos = nodosarbol[0].ChildNodes;
                int i = 0;
                //Recorrido de cada uno de los hijos
                foreach (XmlElement nodoshijos1 in listamodulos)
                {
                    
                    if (llamada)
                    {
                        var nodocombo = new Ext.Net.MenuItem();
                        nodocombo.Text = nodoshijos1.GetAttribute("nombre");
                        nodocombo.Listeners.Click.Handler = "recargar(#{subArbol},'" + nodoshijos1.GetAttribute("idnodo") + "');";
                        //mnuModulos.Items.Add(nodocombo);
                    }

                    //Creación de un nuevo nodo y asignacion de las propiedades
                    var nuevonodo = new TreeNode();
                    nuevonodo.Text = nodoshijos1.GetAttribute("nombre");
                    //nuevonodo.HrefTarget = nodoshijos1.GetAttribute("path");
                    nuevonodo.NodeID = nodoshijos1.GetAttribute("idnodo");
                    nuevonodo.Href = nodoshijos1.GetAttribute("url");
                   
                    //Implementación de un listener para los nodos del arbol
                    //Click.Handler = "if(node.attributes.href){e.stopEvent();cargarTab(node.attributes.hrefTarget, node.attributes.href, node.id, node.text);}";
                 
                    XmlNodeList listahijos = null;
                    //Para determinar el nodo padre dependiendo del id enviado
                    if (string.IsNullOrEmpty(idnodobase))
                    {
                        root.Nodes.Add(nuevonodo);
                        listahijos = listamodulos[i].ChildNodes;
                    }
                    else
                    {
                        if (idnodobase == nodoshijos1.GetAttribute("idnodo"))
                        {
                            listahijos = listamodulos[i].ChildNodes;
                        }
                    }
                    int j = 0;

                    if (listahijos != null)
                        //Recorrido de cada uno de los hijos

                        foreach (XmlElement nodoshijos2 in listahijos)
                        {
                            //Creación de un nuevo nodo y asignacion de las propiedades
                            var nuevonodo1 = new TreeNode();
                            //nuevonodo1.Text = nodoshijos2.Attributes.GetNamedItem("nombre").Value;
                            ////nuevonodo1.HrefTarget = nodoshijos2.Attributes.GetNamedItem("path").Value;
                            //nuevonodo1.NodeID = nodoshijos2.Attributes.GetNamedItem("idnodo").Value;
                            nuevonodo1.Text = nodoshijos2.GetAttribute("nombre");
                            nuevonodo1.HrefTarget = nodoshijos2.GetAttribute("path");
                            nuevonodo1.NodeID = nodoshijos2.GetAttribute("idnodo");
                            nuevonodo1.Href = nodoshijos2.GetAttribute("url");
                            if (string.IsNullOrEmpty(idnodobase))
                            {
                                nuevonodo.Nodes.Add(nuevonodo1);
                            }
                            else
                            {
                                root.Nodes.Add(nuevonodo1);
                            }
                            XmlNodeList listahijos1 = listahijos[j].ChildNodes;
                            int k = 0;

                            if (listahijos1 != null)
                                //Recorrido de cada uno de los hijos
                                foreach (XmlElement nodoshijos3 in listahijos1)
                                {
                                    //Creación de un nuevo nodo y asignacion de las propiedades
                                    var nuevonodo2 =new TreeNode();
                                    nuevonodo2.Text = nodoshijos3.GetAttribute("nombre");
                                    //nuevonodo2.HrefTarget = nodoshijos3.GetAttribute("path");
                                    nuevonodo2.NodeID = nodoshijos3.GetAttribute("idnodo");
                                    nuevonodo2.Href = nodoshijos3.GetAttribute("url");
                                    nuevonodo2.Qtip = nodoshijos3.GetAttribute("nombre");
                                    nuevonodo1.Nodes.Add(nuevonodo2);
                                    XmlNodeList listahijos2 = listahijos1[k].ChildNodes;
                                    int l = 0;

                                    if (listahijos2 != null)
                                        //Recorrido de cada uno de los hijos
                                        foreach (XmlElement nodoshijos4 in listahijos2)
                                        {
                                            //Creación de un nuevo nodo y asignacion de las propiedades
                                            var nuevonodo3 = new TreeNode();
                                            nuevonodo3.Text = nodoshijos4.GetAttribute("nombre");
                                            //nuevonodo3.HrefTarget = nodoshijos4.GetAttribute("path");
                                            nuevonodo3.NodeID = nodoshijos4.GetAttribute("idnodo");
                                            nuevonodo3.Href = nodoshijos4.GetAttribute("url");
                                            nuevonodo3.Qtip = nodoshijos4.GetAttribute("nombre");
                                            nuevonodo2.Nodes.Add(nuevonodo3);
                                            XmlNodeList listahijos3 = listahijos2[l].ChildNodes;

                                            if (listahijos3 != null)
                                                //Recorrido de cada uno de los hijos
                                                foreach (XmlElement nodoshijos5 in listahijos3)
                                                {
                                                    //Creación de un nuevo nodo y asignacion de las propiedades
                                                    var nuevonodo4 = new TreeNode();
                                                    nuevonodo4.Text = nodoshijos5.GetAttribute("nombre");
                                                    //nuevonodo4.HrefTarget = nodoshijos5.GetAttribute("path");
                                                    nuevonodo4.NodeID = nodoshijos5.GetAttribute("idnodo");
                                                    nuevonodo4.Href = nodoshijos5.GetAttribute("url");
                                                    nuevonodo4.Qtip = nodoshijos5.GetAttribute("nombre");
                                                    nuevonodo3.Nodes.Add(nuevonodo4);
                                                }
                                            l++;
                                        }
                                    k++;
                                }
                            j++;
                        }
                    i++;

                }
            }
            catch (Exception ex)
            {
                Util.RegistarLog(ex.ToString());
            }
            return nodes;
        }
        
        
        //Metodo para recargar los datos de la pagina desde el cache
        protected void RefreshHomeTabData(object sender, StoreRefreshDataEventArgs e)
        {
            GenerarFrontal();
        }

        private void GenerarFrontal()
        {
            try
            {
               
                var data = this.Page.Cache["ExamplesGroups"] as List<GrupoPrincipal>;
                if (Session["CacheRolName"].ToString() != Session["CRol"].ToString())
                    data = null;

                if (data == null)
                {
                    data = new List<GrupoPrincipal>();
                    string sName = string.Format("empresas/{0}/resources/frontal{1}.xml", Session["AbrevEmp"].ToString(),Session["CRol"].ToString());

                    UIHelpers.CargarFrontal(data, sName);
                    Session["CacheRolName"] = Session["CRol"].ToString();
                    Page.Cache.Add("ExamplesGroups", data, null, DateTime.Now.AddHours(1), System.Web.Caching.Cache.NoSlidingExpiration, CacheItemPriority.Default, null);
                }

                Store1.DataSource = data;
                Store1.DataBind();
            }
            catch (Exception ex)
            {
                Util.RegistarLog(ex);
            }
        }

        //Metodo para redireccionar a la pagina de Logueo
        protected void btnSalirENTPM_Click(object sender, DirectEventArgs e)
        {
            Session.Abandon();
            Session.Clear();
            X.Js.Call("redirect");
        }

        protected void verMiCuenta_Click(object sender, DirectEventArgs e)
        {
            try
            {

                int idUsuario;
                int.TryParse(Session["IdUsuario"].ToString(), out idUsuario);
                wucUsuarios1.IdEmp = this.IdEmp;
                wucUsuarios1.Mostrar("Editar", idUsuario,false);
            }
            catch (Exception ex)
            {
                Util.RegistarLog(Environment.NewLine + ex.ToString() + Environment.NewLine);
            }
        }

        protected void verFlujo_Click(object sender, DirectEventArgs e)
        {
            try
            {

                winFlujo.Show();
            }
            catch (Exception ex)
            {
                Util.RegistarLog(Environment.NewLine + ex.ToString() + Environment.NewLine);
            }
        }



    }
}